package com.T3;

import java.util.HashMap;
import java.util.Map;

/**
 * @author GB
 * @data 2021/4/28 - 16:03
 * 题目描述
 * 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
 *
 * 示例 1:
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是
 * "abc"，所以其
 * 长度为 3。
 *
 * 示例 2:
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是
 * "b"
 * ，所以其长度为 1。
 *
 * 示例 3:
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是
 * "wke"
 * ，所以其长度为 3。
 *      请注意，你的答案必须是 子串 的长度，
 * "pwke"
 *  是一个子序列，不是子串。
 *
 * 示例 4:
 * 输入: s = ""
 * 输出: 0
 */
public class Solution3 {
    public static void main(String[] args) {
        Solution3 S=new Solution3();
        String test="pwwkew";
        int result=S.lenthOfLongestSubstring(test);
        System.out.println("最长子串长度为："+result);
    }

    public int lenthOfLongestSubstring(String s){
        int res=0;
        Map<Character,Integer> chars=new HashMap<>();
        for (int i=0,j=0;j<s.length();++j){
            char c=s.charAt(j);
            //containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。
            //如果 hashMap 中是否存在指定的 key 对应的映射关系返回 true，否则返回 false。
            if (chars.containsKey(c)){
                // chars.get(c)+1 可能比 i 还小，通过 max 函数来锁住左边界
                // e.g. 在"tmmzuxt"这个字符串中，遍历到最后一步时，最后一个字符't'和第一个字符't'是相等的。
                // 如果没有 max 函数，i 就会回到第一个't'的索引0处的下一个位置
                i=Math.max(i,chars.get(c)+1); //get() 方法获取指定 key 对应对 value。
            }
            chars.put(c,j); //put() 方法将指定的键/值对插入到 HashMap 中。
            res=Math.max(res,j-i+1);
            System.out.println(res);
        }
        System.out.println(chars.toString());
        return res;
    }
}
